#include "Procesador.h"

/* =============================================================================
 * Declaracion Atributos privados
 * =============================================================================
 */
struct Procesador{
    tClock clock;
    tTrabajo trabajo;
};

typedef struct Procesador* _tProcesador;

/*==============================================================================
 * Definicion de metodos publicos
 *==============================================================================
 */

void procesadorCrear(tProcesador* pProcesador){
    
    _tProcesador procesador = (_tProcesador) malloc (sizeof (struct Procesador));
    
    if (procesador)
    {
        procesador->trabajo = NULL;
        
        clockCrear(&(procesador->clock));
        clockSuscribir(procesador->clock, procesador,procesadorEventoNotificacionClock);
    }
    
    *pProcesador = procesador;
}

//------------------------------------------------------------------------------

void procesadorDestruir (tProcesador pProcesador) {
    if (pProcesador)
    {
        clockCancelarSuscripcion(((_tProcesador) pProcesador)->clock, pProcesador);
        clockDestruir(((_tProcesador) pProcesador)->clock);
        
        trabajoDestruir(((_tProcesador) pProcesador)->trabajo);
        
        free ((_tProcesador) pProcesador);
    }
}

//------------------------------------------------------------------------------

tTrabajo procesadorGetTrabajo(tProcesador pProcesador){
    
    tTrabajo val = NULL;
    
    if (pProcesador)
        val = ((_tProcesador)pProcesador)->trabajo;
    
    return val;
}

//------------------------------------------------------------------------------

void procesadorSetTrabajo (tProcesador pProcesador, tTrabajo pTrabajo){

    if (pProcesador)
    {
        ((_tProcesador)pProcesador)->trabajo = pTrabajo;
    }

}

//------------------------------------------------------------------------------

tBool procesadorEstaCorriendo (tProcesador pProcesador){

    tBool corriendo = FALSE;
    
    if (pProcesador)
    {
        tTrabajo trabajo = procesadorGetTrabajo(pProcesador);
        if (trabajo)
            corriendo =  0 < trabajoGetTiempoEjecucion(trabajo);
    }
    return corriendo;
}

//------------------------------------------------------------------------------

tTiempo procesadorCorrer(tProcesador pProcesador, tTiempo pTiempo){
    
    tTiempo val = TIEMPO_INDEF;
    
    if (pProcesador && pTiempo)
    {
        tTrabajo trabajo = procesadorGetTrabajo (pProcesador);
        if (trabajo)
            val = trabajoCorrer(trabajo, pTiempo);
        
        if (0 == val)
        {
            trabajoDestruir(trabajo);
            procesadorSetTrabajo(pProcesador, NULL);
        }
    }
    return val;
}

//------------------------------------------------------------------------------

void procesadorEventoNotificacionClock (tClock pClock, tProcesador pProcesador){
    
    if (pClock && pProcesador)
        procesadorCorrer (pProcesador, clockGetTiempo(pClock));
}
